package NetWork;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 石方旭
 * Date: 2022-08-13
 * Time: 10:33
 */
public class UdpEchoClint {

    //1.用户进行输入请求,构造请求数据报
    //2.将请求数据报发送给服务器
    //3.服务器根据请求做出响应,客户端接收响应
    //4.将请求和响应结果显示给客户

    //socket用于接收和发送数据报
    DatagramSocket socket = null;

    //客户端不需要指定端口号,因为客户端的端口号是不能确定的,如果指定就容易和本机上的端口号重提
    //而服务器上的端口号需要我们进行指定,如果不指定,客户端就不知道要发给谁
    public UdpEchoClint() throws SocketException {
        //这里要处理Socket异常
        //创建一个DatagramSocket对象==>打开系统里的socket文件==>可以进行接收和发送数据
        socket = new DatagramSocket();
    }

    //开启客户端运行
    public void start() throws IOException {
        System.out.println("客户端开始运行!!!");
        Scanner scan = new Scanner(System.in);
        while(true){
            //用户输入提示符
            System.out.print(">");
            //用户输入请求数据到服务器
            String request = scan.next();
            //将数据打包成数据报发送给服务器==>标明目的地:IP地址,给谁:端口号
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(),
                    request.getBytes().length,
                    InetAddress.getByName("127.0.0.1"),8000);
            //将数据报发送给服务器
            socket.send(requestPacket);
            //客户端发送给服务器数据之后,服务器接收后做出响应
            //这里客户端要接收响应===>放到字节数组中
            DatagramPacket responsePacket = new DatagramPacket(new byte[4096],4096);
            //客户端接收响应
            socket.receive(responsePacket);
            //将响应转化成字符串
            String response = new String(responsePacket.getData(),0, responsePacket.getLength());
            //将信息输出
            System.out.printf("request : %s ; response : %s\n",request,response);
        }
    }

    public static void main(String[] args) throws IOException {
        UdpEchoClint clint = new UdpEchoClint();
        clint.start();
    }


}
